package com.witmore.skyline.web.service.impl;

import com.witmore.skyline.web.annotation.ApiCache;
import com.witmore.skyline.web.enums.TimePrecision;
import com.witmore.skyline.web.service.DeviceOilCacheService;
import com.witmore.skyline.web.service.third.yjx.client.ApiDeviceOilClient;
import com.witmore.skyline.web.service.third.yjx.dto.ApiResponse;
import com.witmore.skyline.web.service.third.yjx.dto.DeviceOilDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 设备油位数据缓存服务实现
 * 专门处理带缓存的数据获取逻辑
 * <p>
 * Author: 豆子高
 * Date: 2025/11/18
 */
@Slf4j
@Service
public class DeviceOilCacheServiceImpl implements DeviceOilCacheService {

    @Autowired
    private ApiDeviceOilClient apiDeviceOilClient;

    /**
     * 获取当天油位数据（带5分钟缓存，使用CACHE_WINDOW自动对齐时间窗口）
     * @ApiCache 切面会自动处理缓存逻辑
     */
    @Override
    @ApiCache(
        expireMinutes = 5,
        keyParams = {"deviceSn", "startTime", "endTime"},
        timeParams = {"startTime", "endTime"},
        timePrecision = TimePrecision.CACHE_WINDOW,
        keyPrefix = "DeviceOilCacheService:fetchTodayData"
    )
    public List<DeviceOilDTO> fetchTodayDataWithCache(String deviceSn, String startTime, String endTime) {
        return fetchByPagination(deviceSn, startTime, endTime);
    }

    /**
     * 分页获取油位数据
     * @param deviceSn 设备编号
     * @param startTime 开始时间（格式：yyyy-MM-dd HH:mm:ss）
     * @param endTime 结束时间（格式：yyyy-MM-dd HH:mm:ss）
     * @return 所有数据合并后的列表，接口失败或数据不完整返回null
     */
    private List<DeviceOilDTO> fetchByPagination(String deviceSn, String startTime, String endTime) {
        List<DeviceOilDTO> allData = new ArrayList<>();
        int page = 1;  // 云机械页码从1开始
        int size = 2000;  // 云机械最大支持2000
        boolean hasMore = true;

        while (hasMore) {
            // 调用云机械分页接口
            ApiResponse<List<DeviceOilDTO>> response = apiDeviceOilClient.fetchDeviceOilPercentWithPage(
                    deviceSn, startTime, endTime, page, size);

            if (response == null) {
                // 接口调用失败（可能是限流），记录日志并返回null（表示数据不完整，不应缓存）
                log.error("分页获取油位数据失败（接口调用异常/限流）, deviceSn={}, page={}, startTime={}, endTime={}",
                        deviceSn, page, startTime, endTime);
                return null;  // 返回null表示数据不完整
            }

            if (CollectionUtils.isEmpty(response.getResult())) {
                // 正常情况下数据为空，结束分页
                hasMore = false;
            } else {
                List<DeviceOilDTO> pageData = response.getResult();
                allData.addAll(pageData);

                // 通过 page.last 判断是否最后一页
                boolean isLast = response.getPage() != null && Boolean.TRUE.equals(response.getPage().getLast());

                if (isLast) {
                    // 最后一页，结束分页
                    hasMore = false;
                } else {
                    page++;
                }
            }
        }

        return allData;
    }
}
